﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOH_Competencia : DAO
    {
        //Atributos de manejo de instancia (singleton)
        static DAOH_Competencia instance = null; 
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.H_CompetenciaDataTable H_CompetenciaTabla = new DataSetConsultora.H_CompetenciaDataTable();
        private H_CompetenciaTableAdapter H_CompetenciaTableAdapter = new H_CompetenciaTableAdapter();
        // Dependencias de otros DAOs
        private DAOH_Factor miDAOH_Factor = DAOH_Factor.Instance;

        public static DAOH_Competencia Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOH_Competencia();
                        }
                    }
                }
                return instance;
            }
        }

        public void guardar(Cuestionario unCuestionario)
        {            
            foreach (H_competencia unaH_competencia in unCuestionario._competencias){
                
                // Inserto la Historial de competencia en la db por medio de su table adapter correspondiente
                H_CompetenciaTabla = H_CompetenciaTableAdapter.Insertar(unaH_competencia._nombre, unaH_competencia._ponderacionrequerida, unaH_competencia._descripcion, unCuestionario._cod_cuestionario, unaH_competencia._ponderacionobtenida);
                                
                // Le seteo el id a la competencia con el que fue insertada
                unaH_competencia._cod_h_competencia = recolectarId();
                
                // Retorno la historial competencia que inserte
                miDAOH_Factor.guardar(unaH_competencia, unCuestionario._cod_cuestionario);
            }
        }

        public H_competencia guardar(H_competencia unaH_competencia, int id_cuestionario)
        {
            // Inserto la Historial de competencia en la db por medio de su table adapter correspondiente
            H_CompetenciaTabla = H_CompetenciaTableAdapter.Insertar(unaH_competencia._nombre, unaH_competencia._ponderacionrequerida, unaH_competencia._descripcion, id_cuestionario, unaH_competencia._ponderacionobtenida);
                        
            // Retorno la historial competencia que inserte
            return recolectarUno();
        }

        public void actualizar(H_competencia unaH_competencia)
        {

            // Actualizo la Respuesta en la db pro medio de su table adapter
            H_CompetenciaTableAdapter.Actualizar(unaH_competencia._nombre, unaH_competencia._ponderacionrequerida, unaH_competencia._descripcion, unaH_competencia._cod_h_competencia,unaH_competencia._ponderacionobtenida);

        }


        public List<H_competencia> cargar()
        {

            // Cargo los H_Competencia de la db
            H_CompetenciaTabla = H_CompetenciaTableAdapter.GetData();

            // Finalmente devuelvo la lista de H_competenciasCargados, recolectadas por la funcion            
            return recolectar();
        }

        public List<H_competencia> cargar(Int32 unCuestionario_id)
        {   // obtengo la empresa por id en empresaTabla
            H_CompetenciaTabla = H_CompetenciaTableAdapter.ConsultarPor(unCuestionario_id);

            // Finalmente devuelvo la lista de H_competenciasCargados, recolectadas por la funcion            
            return recolectar();
        }

        private List<H_competencia> recolectar(){

            // Creo la lista para recolectar y devolver los H_competencias cargadas de la db
            List<H_competencia> H_competenciasCargados = new List<H_competencia>();

            // Recorro los H_competencias de la tabla
            foreach (DataSetConsultora.H_CompetenciaRow unaH_competenciaFila in H_CompetenciaTabla)
            {

                // Creo un H_competencia y lo agrego a la lista de H_competencias cargados
                H_competenciasCargados.Add(new H_competencia(unaH_competenciaFila.id,
                                                       unaH_competenciaFila.Nombre,
                                                       unaH_competenciaFila.Descripción,
                                                       unaH_competenciaFila.Ponderación,
                                                       unaH_competenciaFila.Ponderacion_Obtenida,
                                                       miDAOH_Factor.cargar(unaH_competenciaFila.id)
                                                      )
                                        );

            }

            return H_competenciasCargados;
        }

        public H_competencia recolectarUno()
        {
            if (H_CompetenciaTabla.Count > 0)
            {
                // Finalmente retorno un nuevo objeto Empresa mapeado de la tabla
                return new H_competencia(H_CompetenciaTabla[0].id,
                                        H_CompetenciaTabla[0].Nombre,
                                        H_CompetenciaTabla[0].Descripción,
                                        H_CompetenciaTabla[0].Ponderación,
                                        H_CompetenciaTabla[0].Ponderacion_Obtenida,
                                        miDAOH_Factor.cargar(H_CompetenciaTabla[0].id)
                                        );
            }

            return new H_competencia();

        }

        private int recolectarId()
        {
            if (H_CompetenciaTabla.Count > 0)
            {
                return H_CompetenciaTabla[0].id;
            }

            return -1;
        }
    }
}
